home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / keep.zip / MASSDEL.PAS < prev    next >
Pascal/Delphi Source File  |  1991-12-19  |  9KB  |  375 lines

  1. program massDel;
  2. {-----------------------------------------------------------------------------
  3.  -                                                                           -
  4.  -  MASSDEL.PAS                                                              -
  5.  -                                                                           -
  6.  -    Author: Rick Owen                                                      -
  7.  -    Date  : 12/17/91                                                       -
  8.  -    Massdel:                                                               -
  9.  -     1) parses the command line for file names (or file specs)             -
  10.  -     2) deletes all files which match the specification(s)                 -
  11.  -  These programs carry no warranties either expressed or implied.  I       -
  12.  -  assume no liability of any kind [use at YOUR risk].  Any program         -
  13.  -  which deletes files is inherently dangerous and you should be            -
  14.  -  extremely careful when using either KEEP or MASSDEL.  You are free to    -
  15.  -  use both programs however you wish, and you may freely distribute        -
  16.  -  copies of either program, as long as you do not charge for it [connect   -
  17.  -  charges to BBSes are excluded from this restriction].                    -
  18.  -----------------------------------------------------------------------------}
  19.  
  20. uses dos, crt;
  21.  
  22. const
  23.  
  24.   MAXPARMS  = 50;
  25.   ReadOnly  = $01;
  26.   Hidden    = $02;
  27.   SysFile   = $04;
  28.   VolumeID  = $08;
  29.   Directory = $10;
  30.   Archive   = $20;
  31.  
  32.   DEBUG     = false;
  33.  
  34. type
  35.   parmList  = array[1..MAXPARMS] of String[12];
  36.  
  37. var
  38.   fileParms   : parmList;
  39.   confirm     : boolean;
  40.   silent      : boolean;
  41.   fileCount   : word;
  42.   parmCount   : word;
  43.  
  44. procedure help;
  45.  
  46. begin { help }
  47.  
  48.   writeln('massDel v1.0 - delete all files specified.');
  49.   writeln('usage: massDel [-d] [-s] filespec1 [filespec2 ... filespecN]');
  50.   writeln('   -d = dangerous mode (no confirm)');
  51.   writeln('   -s = silent mode (no report as files are deleted)');
  52.   writeln('        defaults : confirm and not silent');
  53.   writeln;
  54.   writeln('massDel was written in Turbo Pascal V6.0 by Rick Owen');
  55.   writeln('Revision level = 0, Release date = 12/18/91.');
  56.   halt(1);
  57.  
  58. end { help };
  59.  
  60. procedure miniHelp;
  61.  
  62. begin { miniHelp }
  63.  
  64.   writeln;
  65.   writeln(' y - yes, delete file');
  66.   writeln(' n - no, do not delete file');
  67.   writeln(' q - no, do not delete file and terminate the program');
  68.   writeln(' c - yes, delete file and continue without further confirmation');
  69.   writeln(' l - list remaining files which will be deleted');
  70.   writeln;
  71.  
  72. end; {miniHelp }
  73.  
  74. procedure getParameters;
  75.  
  76. var
  77.   parmLoop    : Word;
  78.   parm        : string[1];
  79.  
  80. begin { getParameters }
  81.  
  82.   if (ParamCount < 0) or (ParamCount > MAXPARMS) then
  83.   begin
  84.     help; { we don't return from help }
  85.   end
  86.   else
  87.   begin
  88.  
  89.     confirm   := true;
  90.     silent    := false;
  91.     parmCount := 1;
  92.  
  93.     for parmLoop := 1 to ParamCount do
  94.     begin
  95.       if copy(ParamStr(parmLoop),1,1) = '-' then
  96.       begin
  97.         { this is a parameter }
  98.         parm := copy(ParamStr(parmLoop),2,1);
  99.         if ((parm = 's') or (parm = 'S')) then
  100.           silent := true;
  101.         if ((parm = 'd') or (parm = 'D')) then
  102.           confirm := false;
  103.         if (pos(parm,'sSdD') = 0) then
  104.         begin
  105.           write('Unknown parameter - ignored');
  106.           writeln;
  107.         end
  108.       end
  109.       else
  110.       begin
  111.         fileParms[parmCount] := ParamStr(parmLoop);
  112.         inc(parmCount);
  113.       end
  114.     end; { loop }
  115.     dec(parmCount);
  116.     if parmCount = 0 then
  117.       help;
  118.   end; { for }
  119.  
  120. end; { getParameters }
  121.  
  122. function LeadingZero(w : Word) : String;
  123.  
  124. var
  125.   s : String;
  126.  
  127. begin { LeadingZero }
  128.  
  129.   Str(w:0,s);
  130.   if Length(s) = 1 then
  131.     s := '0' + s;
  132.   LeadingZero := s;
  133.  
  134. end; { LeadingZero }
  135.  
  136. procedure writeFileData( dta : SearchRec );
  137.  
  138. var
  139.   dt        : DateTime;
  140.  
  141. begin { writeFileData }
  142.  
  143.     write(dta.name:12);
  144.     write(dta.size:8);
  145.     write(' ');
  146.     UnpackTime(dta.time,dt);
  147.     with dt do
  148.     begin
  149.       Write(' ',LeadingZero(day), '/',LeadingZero(month),'/',
  150.             LeadingZero(year));
  151.       Write(' ', LeadingZero(hour),':',
  152.             LeadingZero(min),':', LeadingZero(sec));
  153.       Write(' ');
  154.     end;
  155.  
  156. end; { writeFileData }
  157.  
  158. procedure listRemainingFiles(      dta : SearchRec;
  159.                              whichParm : word;
  160.                              fileParms : parmList );
  161.  
  162. var
  163.  
  164.   t           : SearchRec;
  165.   lineCount   : word;
  166.   ch          : Char;
  167.   parmLoop    : word;
  168.  
  169. begin { listRemainingFiles }
  170.  
  171.   parmLoop := whichParm;
  172.   DosError := 0;
  173.  
  174.   writeln;
  175.   lineCount := 2;
  176.   writeln('───────────── Start of List ─────────────');
  177.  
  178.   For parmLoop := whichParm to parmCount do
  179.   begin
  180.  
  181.     if parmLoop = whichParm then
  182.     begin
  183.       move(dta, t, SizeOf(t));
  184.     end
  185.     else
  186.     begin
  187.       findfirst(fileParms[parmLoop], Archive, t);
  188.     end;
  189.  
  190.  
  191.     while DosError = 0 do
  192.     begin
  193.  
  194.       writeFileData( t );
  195.       writeln;
  196.       inc(lineCount);
  197.       if lineCount > 24 then
  198.       begin
  199.         write('───────── pausing - press a key ─────────');
  200.         ch := readKey;
  201.         if ch = #27 then
  202.         begin
  203.           writeln;
  204.           exit;
  205.         end;
  206.         writeln;
  207.         lineCount := 1;
  208.       end;
  209.       findNext( t );
  210.  
  211.     end; { while }
  212.  
  213.   end;
  214.  
  215.   writeln('────────────── End of List ──────────────');
  216.  
  217. end; { listRemainingFiles }
  218.  
  219. procedure writePrompt;
  220. begin { writePrompt }
  221.   Write(' : delete (y/N/q/c/l/?) ');
  222. end; { writePrompt }
  223.  
  224. procedure deleteTheFiles;
  225.  
  226. var
  227.   fileLoop    : Word;
  228.   dta         : SearchRec;
  229.   listDta     : SearchRec;
  230.   dt          : DateTime;
  231.   confirmKey  : char;
  232.   doExit      : boolean;
  233.   doStop      : boolean;
  234.   deleteIt    : boolean;
  235.   f           : file;
  236.  
  237.   debugLoop   : word;
  238.  
  239. begin { deleteTheFiles }
  240.  
  241.   fileCount := 1;
  242.   deleteIt := true;
  243.   doExit   := false;
  244.   doStop   := false;
  245.  
  246.   for fileLoop := 1 to parmCount do
  247.   begin
  248.  
  249.     if (DEBUG) then
  250.     begin
  251.       writeln('searching for ',fileParms[fileLoop]);
  252.     end;
  253.  
  254.     findfirst(fileParms[fileLoop], Archive, dta);
  255.  
  256.     if (DEBUG) then
  257.     begin
  258.       writeln('after FindFirst DosError = ',DosError:3);
  259.     end;
  260.  
  261.     while DosError = 0 do
  262.     begin
  263.  
  264.  
  265.       if confirm then
  266.       begin
  267.         writeFileData( dta );
  268.         writePrompt;
  269.  
  270.         repeat
  271.  
  272.           confirmKey := upcase(readkey);
  273.  
  274.           case confirmKey of
  275.             'Y'     : begin
  276.                         deleteIt := true;
  277.                         doExit   := true
  278.                       end;
  279.             'N',#13 : begin
  280.                         doExit   := true;
  281.                         deleteIt := false;
  282.                       end;
  283.             'Q',#27 : begin
  284.                         doExit := true;
  285.                         doStop := true;
  286.                       end;
  287.             'L'     : begin
  288.                         listRemainingFiles( dta, fileLoop, fileParms );
  289.                         writeFileData( dta );
  290.                         writePrompt;
  291.                       end;
  292.             'C'     : begin
  293.                         doExit   := true;
  294.                         deleteIt := true;
  295.                         confirm  := false
  296.                       end;
  297.             '?'     : begin
  298.                         miniHelp;
  299.                         writeFileData( dta );
  300.                         writePrompt;
  301.                       end;
  302.  
  303.             else      doExit := false;
  304.  
  305.           end; { case }
  306.  
  307.         until doExit;
  308.         writeln;
  309.       end;
  310.  
  311.       if doStop then
  312.       begin
  313.  
  314.         halt(5);
  315.  
  316.       end;
  317.  
  318.       if deleteIt then
  319.       begin
  320.  
  321.         Assign(f, dta.name);
  322.         {$I-}
  323.         Reset(f);
  324.         {$I+}
  325.         if IOResult <> 0 then
  326.         begin
  327.           WriteLn('Cannot find ', dta.name);
  328.           halt(6);
  329.         end
  330.         else
  331.         begin
  332.           Close(f);
  333.           if not silent then
  334.             writeln('  deleting ', dta.name);
  335.           Erase(f);
  336.  
  337.         end;
  338.  
  339.       end;
  340.  
  341.       if (DEBUG) then
  342.       begin
  343.         write('searching for next ');
  344.         for debugLoop := 1 to 21 do
  345.         begin
  346.           if (dta.fill[debugLoop] > 31) and (dta.fill[debugLoop] < 127) then
  347.             write(chr(dta.fill[debugLoop]))
  348.           else
  349.             write('~');
  350.         end; { for }
  351.         writeln;
  352.       end;
  353.  
  354.       findnext(dta);
  355.  
  356.       if (DEBUG) then
  357.       begin
  358.         writeln('after FindNext DosError = ',DosError:3);
  359.       end;
  360.  
  361.     end; { while }
  362.  
  363.   end; { for }
  364.  
  365. end; { deleteTheFiles }
  366.  
  367. begin { massDel }
  368.  
  369.   CheckBreak := false;
  370.   getParameters;
  371.   deleteTheFiles;
  372.  
  373. end { massDel }.
  374.  
  375.